/**
 * File: linked_list.c
 */

#include "linked_list.h"
#include "common.h"

void insert_item(LinkedListNode *n0, LinkedListNode *p) // 在节点n0之后插入节点p
{
  LinkedListNode *n1 = n0->next; // n0的后继
  p->next = n1;
  n0->next = p;
}

void remove_item(LinkedListNode *n0) // 删除n0的后继
{
  if (!n0) return; // 排除n0是NULL的情形
  if (!n0->next) return; // 排除n0的后继是NULL的情形
  // n0 -> p -> n1
  LinkedListNode *p = n0->next; // n0的后继
  LinkedListNode *n1 = p->next; // p的后继
  n0->next = n1;
  free(p); // 节点都是使用malloc动态分配内存的，因此需要释放内存
}

LinkedListNode *access_item(LinkedListNode *head, int index) // 通过索引访问节点
{
  if (!head) return NULL;
  int counter = 0;
  while (head)
  {
    counter++;
    head = head->next;
    if (counter == index) return head;
  }
  return NULL;
}

int find_item(LinkedListNode *head, int target) // 查找节点，获取节点的索引
{
  int index = 0;
  while (head)
  {
    if (head->value == target) return index;
    head = head->next;
    index++;
  }
  return -1;
}

void destory_linked_list(LinkedListNode *head) // 销毁链表并释放内存
{
  LinkedListNode *p;
  while (head)
  {
    p = head;
    head = p->next;
    free(p);
  }
}

void print_linked_list(LinkedListNode *head) // 打印链表
{
  printf("{ ");
  while (head)
  {
    if (head->next) printf("%d -> ", head->value);
    else printf("%d ", head->value);
    head = head->next;
  }
  puts("}");
}